package models

import (
	"errors"
	"fmt"
	"gorm.io/gorm"
	"time"
)

// UserTeam 用户团队关联结构体
type UserTeam struct {
	ID        uint64    `gorm:"column:id;primaryKey;autoIncrement" json:"id" form:"id"`
	UserID    uint64    `gorm:"column:user_id;notNull" json:"user_id" form:"user_id"`
	TeamID    uint64    `gorm:"column:team_id;notNull" json:"team_id" form:"team_id"`
	CreatedAt time.Time `gorm:"column:created_at;default:CURRENT_TIMESTAMP" json:"created_at" form:"created_at"`
	UpdatedAt time.Time `gorm:"column:updated_at;default:CURRENT_TIMESTAMP;updateDefault:CURRENT_TIMESTAMP" json:"updated_at" form:"updated_at"`
}

// TableName 返回表名
func (UserTeam) TableName() string {
	return "user_teams"
}

//	GetTeamMemberIDs
//
// 描述信息： 根据团队ID返回团队成员的个数和成员ID切片
//
// Param：
//
//	db ：数据库连接
//	teamID ：团队id
//
// Return：
//
//	int ：成员个数
//	[]uint64 ：成员id切片
//	error ：错误信息
func GetTeamMemberIDs(db *gorm.DB, teamID uint64) (int, []uint64, error) {
	var userIDs []uint64

	// 查询团队成员的 user_id
	if err := db.Model(&UserTeam{}).Select("user_id").Where("team_id = ?", teamID).Scan(&userIDs).Error; err != nil {
		if errors.Is(err, gorm.ErrRecordNotFound) {
			return 0, nil, nil // 没有找到记录，返回零值
		}
		return 0, nil, err // 发生其他错误，返回错误
	}

	return len(userIDs), userIDs, nil
}

//	GetUserDetailsByID
//
// 描述信息： 根据用户ID切片返回成员的详细信息
//
// Param：
//
//	db ：数据库连接
//	userIDs ：用户id切片
//
// Return：
//
//	[]User ：用户信息
//	error ：错误信息
func GetUserDetailsByID(db *gorm.DB, userIDs []uint64) ([]User, error) {
	var users []User

	// 查询用户详细信息
	if len(userIDs) == 0 {
		return users, nil // 如果没有用户ID，直接返回空切片
	}

	if err := db.Where("id IN ?", userIDs).Find(&users).Error; err != nil {
		return nil, err // 发生错误，返回错误
	}

	return users, nil
}

//	GetUserTeamIDs
//
// 描述信息： 返回用户所在的所有团队的teamID切片
//
// Param：
//
//	db ：数据库连接实例
//	userID ：用户id
//
// Return：
//
//	[]uint64 ：用户的团队id列表
//	error ：错误信息
func GetUserTeamIDs(db *gorm.DB, userID uint64) ([]uint64, error) {
	var userTeams []UserTeam
	var teamIDs []uint64

	// 查询用户所在的所有团队
	result := db.Model(&userTeams).Select("team_id").Where("user_id = ?", userID).Find(&userTeams)

	if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) {
		fmt.Println("GetUserTeamIDs失败")
		return nil, result.Error
	}

	// 提取teamID到切片
	for _, userTeam := range userTeams {
		teamIDs = append(teamIDs, userTeam.TeamID)
	}

	return teamIDs, nil
}

//	CheckUserTeamExists
//
// 描述信息： 根据 UserID 和 TeamID 判断是否存在记录
//
// Param：
//
//	db ：数据库连接实列
//	userID ：用户id
//	teamID ：团队id
//
// Return：
//
//	bool ：存在true，不存在false
//	error ：错误信息
func CheckUserTeamExists(db *gorm.DB, userID uint64, teamID uint64) (bool, error) {
	var count int64
	err := db.Model(&UserTeam{}).Where("user_id = ? AND team_id = ?", userID, teamID).Count(&count).Error
	if err != nil {
		return false, err
	}
	return count > 0, nil
}

//	InsertUserTeamIfNotExists
//
// 描述信息： 根据 UserID 和 TeamID 插入记录（如果不存在）
//
// Param：
//
//	db ：数据库链接实例
//	userID ：用户id
//	teamID ：团队id
//
// Return：
//
//	error ：错误信息
func (u UserTeam) InsertUserTeamIfNotExists(db *gorm.DB, userID uint64, teamID uint64) error {
	// 检查是否存在记录
	exists, err := CheckUserTeamExists(db, userID, teamID)
	if err != nil {
		return err
	}
	// 如果记录已存在，直接返回
	if exists {
		return nil
	}
	// 如果记录不存在，插入新记录
	newRecord := UserTeam{
		UserID:    userID,
		TeamID:    teamID,
		CreatedAt: time.Now(),
		UpdatedAt: time.Now(),
	}
	// 插入记录
	return db.Create(&newRecord).Error
}

//	DeleteUserTeamByUserIDAndTeamID
//
// 描述信息： 根据 user_id 和 team_id 删除一条数据
//
// Param：
//
//	db ：
//	userID ：用户id
//	teamID ：团队id
//
// Return：
//
//	error ：错误信息
func (u UserTeam) DeleteUserTeamByUserIDAndTeamID(db *gorm.DB, userID uint64, teamID uint64) error {
	// 删除操作
	result := db.Where("user_id = ? AND team_id = ?", userID, teamID).Delete(&UserTeam{})
	if result.Error != nil {
		// 如果发生错误，返回错误
		return result.Error
	}
	return nil
}

// DeleteUserTeamsByTeamID 根据 team_id 删除所有相关的 UserTeam 数据
func (u UserTeam) DeleteUserTeamsByTeamID(db *gorm.DB, teamID uint64) error {
	// 删除所有匹配 team_id 的记录
	result := db.Where("team_id = ?", teamID).Delete(&UserTeam{})
	if result.Error != nil {
		return fmt.Errorf("failed to delete user teams with team_id %d: %w", teamID, result.Error)
	}
	return nil
}
